将IPv6地址转为全写或简写格式 您所在的位置:网站首页 Ipv6 使用冒号 16 进制记法 将IPv6地址转为全写或简写格式

将IPv6地址转为全写或简写格式

2024-06-11 02:56| 来源: 网络整理| 查看: 265

输入IPv6地址,IPv6地址可以为全写、简写、半简写,或者包含前导0等任意形式

parseFullIPv6函数:将输入的IPv6地址格式化为全写格式,省略前导0

parseAbbrIPv6函数:将输入的IPv6地址格式化为简写格式

public static final String IPv6Reg = "([\\da-fA-F]{1,4}:){7}[\\da-fA-F]{1,4}$" + "|^:((:[\\da-fA-F]{1,4}){1,6}|:)$" + "|^[\\da-fA-F]{1,4}:((:[\\da-fA-F]{1,4}){1,5}|:)$" + "|^([\\da-fA-F]{1,4}:){2}((:[\\da-fA-F]{1,4}){1,4}|:)$" + "|^([\\da-fA-F]{1,4}:){3}((:[\\da-fA-F]{1,4}){1,3}|:)$" + "|^([\\da-fA-F]{1,4}:){4}((:[\\da-fA-F]{1,4}){1,2}|:)$" + "|^([\\da-fA-F]{1,4}:){5}:([\\da-fA-F]{1,4})?$" + "|^([\\da-fA-F]{1,4}:){6}:"; // IPv6地址的格式 /** * 将一个IPv6地址转为全写格式,全写中的前导0省略 * 例:将1ade:03da:0::转为1ade:3da:0:0:0:0:0:0 * * @param IPv6Str * @return fullIPv6 */ public static String parseFullIPv6(String IPv6Str) { // 判断IPv6地址的格式是否正确 if (!IPv6Str.matches(IPv6Reg)) { return ""; } String[] arr = new String[]{"0", "0", "0", "0", "0", "0", "0", "0"}; // 将IPv6地址用::分开 // 如果IPv6地址为::,tempArr.length==0 // 如果不包含::或以::结尾,tempArr.length==1 // 如果以::开头或::在中间,tempArr.length==2 String[] tempArr = IPv6Str.split("::"); // tempArr[0]用:分开,填充到arr前半部分 if (tempArr.length > 0) { // new String[0]为空数组,因为"".split(":")为{""},如果tempArr[0]=="",此时数组包含一个元素 String[] tempArr0 = tempArr[0].isEmpty() ? new String[0] : tempArr[0].split(":"); for (int i = 0; i < tempArr0.length; i++) { // 如果是纯数字,用parseInt去除前导0,如果包含字母,用正则去除前导0 arr[i] = tempArr0[i].matches("\\d+") ? (Integer.parseInt(tempArr0[i]) + "") : tempArr0[i].replaceAll("^(0+)", ""); } } // tempArr[1]用:分开,填充到arr后半部分 if (tempArr.length > 1) { String[] tempArr1 = tempArr[1].isEmpty() ? new String[0] : tempArr[1].split(":"); for (int i = 0; i < tempArr1.length; i++) { arr[i + arr.length - tempArr1.length] = tempArr1[i].matches("\\d+") ? (Integer.parseInt(tempArr1[i]) + "") : tempArr1[i].replaceAll("^(0+)", ""); } } return StringUtils.join(arr, ":"); } /** * 将一个IPv6地址转为简写格式 * 例:将1ade:03da:0::转为1ade:3da:: * * @param IPv6Str * @return AbbrIPv6 */ public static String parseAbbrIPv6(String IPv6Str) { // 将一个IPv6地址转为全写格式,全写中的前导0省略 String fullIPv6 = parseFullIPv6(IPv6Str); if (fullIPv6.isEmpty()) { // 如果IPv6地址的格式不正确 return ""; } // 将1ade:3da:0:0:0:0:0:99转为{"-","-","0","0","0","0","0","-"} String[] arr = fullIPv6.split(":"); for (int i = 0, len = arr.length; i < len; i++) { if (!"0".equals(arr[i])) { arr[i] = "-"; } } // 找到最长的连续的0 Pattern pattern = Pattern.compile("0{2,}"); Matcher matcher = pattern.matcher(StringUtils.join(arr, "")); String maxStr = ""; int start = -1; int end = -1; while (matcher.find()) { if (maxStr.length() < matcher.group().length()) { maxStr = matcher.group(); start = matcher.start(); end = matcher.end(); } } // 合并 arr = fullIPv6.split(":"); if (maxStr.length() > 0) { for (int i = start; i < end; i++) { arr[i] = ":"; } } return StringUtils.join(arr, ":").replaceAll(":{2,}", "::"); }

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有